package com.eva.databuilder.bo;

import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.HashMap;
import java.util.List;

@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(
    value = "模板数据参数",
    description = "包含所有获取模板数据的所需参数"
)
public class TemplateDataParameters extends HashMap<String, Object> {

    /**
     * 获取字符串值
     *
     * @param parameterName 参数名
     * @param defaultValue 默认值
     * @return String
     */
    public String getString (String parameterName, String defaultValue) {
        return this.getValue(parameterName, defaultValue, String.class);
    }

    /**
     * 获取Integer类型值
     *
     * @param parameterName 参数名
     * @param defaultValue 默认值
     * @return Integer
     */
    public Integer getInteger (String parameterName, Integer defaultValue) {
        return this.getValue(parameterName, defaultValue, Integer.class);
    }

    /**
     * 获取List类型值
     *
     * @param parameterName 参数名
     * @param defaultValue 默认值
     * @return List<T>
     */
    public <T> List<T> getList (String parameterName, List<T> defaultValue) {
        return this.getValue(parameterName, defaultValue, List.class);
    }

    /**
     * 获取指定类型值
     * @param parameterName 参数名
     * @param defaultValue 默认值
     * @param clazz 类型类
     * @return T
     */
    public <T> T getValue (String parameterName, T defaultValue, Class<T> clazz) {
        Object value = this.get(parameterName);
        if (value == null) {
            return defaultValue;
        }
        return JSON.parseObject(JSON.toJSONString(value), clazz);
    }

    /**
     * 参数赋值（指定参数值不为空时才赋值）
     *
     * @param key 参数名
     * @param value 参数值
     */
    public void assignIfNotEmpty(String key, Object value) {
        // 值为空时保留原始值，避免预设参数为空时覆盖了请求携带的参数
        if (value == null || "".equals(value)) {
            return;
        }
        if ("[]".equals(JSON.toJSONString(value))) {
            return;
        }
        this.put(key, value);
    }

    @Data
    @ApiModel("预设参数")
    public static class PresetParameter {

        @ApiModelProperty("参数名称")
        private String name;

        @ApiModelProperty("参数值")
        private Object value;
    }
}
